const obj = {
  a: {
    b: {
      c: 2,
      d: 5,
    },
    e: {
      f: 1,
      h: {
        i: 3,
      }
    }
  },
  j: 4,
}

function flatten (obj) { // 传入的参数是一个对象
  let result = [] // 结果数组 是个二维数组 key和val
  function backTracking (obj, str) { // 传入的参数是这个obj 还有这个str
    let keys = Object.keys(obj) // 得到所有的key
    for (let key of keys) { // 遍历这个所有的key
      if (obj[key] instanceof Object) { // 如果是个对象
        if (str.length === 0) { // 判断长度是不是0
          backTracking(obj[key], str + key) // 如果是0 就没有点 然后继续调用这个函数
        } else {
          backTracking(obj[key], str + '.' + key) // 不是就有.
        }
      } else {
        if (str.length === 0) { // 如果不是对象 就可以放入结果数组
          result.push([str + key, obj[key]])
        } else {
          result.push([str + '.' + key, obj[key]]) // 不是0 有长度 放入结果数组
        }
      }
    }
  }
  backTracking(obj, '')
  return Object.fromEntries(result) // 从二维数组生成对象
}

let res = flatten(obj)
console.log(res)






